package file;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Scanner;

// 搜索指定路径，查找该目录及其子目录中所有文件名和内容包含指定字符的文件
// 程序效率较低，实际使用中采用更加权威的搜索引擎
public class Demo11 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要搜索的路径：");
        String rootPath = scanner.next();

        System.out.println("请输入指定的关键字：");
        String keyword = scanner.next();

        File rootFile = new File(rootPath);
        // 如果该路径不是目录，返回
        if(!rootFile.isDirectory()){
            System.out.println("该路径不是目录名！");
            return;
        }

        // 是目录名，遍历所有子目录
        scanFile(rootFile, keyword);
    }

    // 扫描所有子目录
    private static void scanFile(File rootFile, String keyword){
        // 列出根目录下所有文件
        File[] files = rootFile.listFiles();

        // 如果当前目录为空
        if(rootFile == null){
            return;
        }

        for(File file : files){
            // 如果是目录，递归
            if(file.isDirectory()){
                scanFile(file, keyword);
            }// 如果是文件，判断有没有关键字
            else if(file.isFile()){
                judFile(file, keyword);
            }
        }
    }

    // 判断文件名或文件内容是否含有keyword
    private static void judFile(File file, String keyword){
        // 文件名是否包含关键字
        if(file.getName().contains(keyword)){
            System.out.println("文件名包含关键字" + file.getAbsolutePath());
            return;
        }
        // 文件内容是否包含关键字
        StringBuilder stringBuilder = new StringBuilder("");
        try(Reader reader = new FileReader(file)){
            // 读取文件中的内容
            while(true){
                char[] chars = new char[1024];
                // 返回值为n
                int n = reader.read(chars);
                // 读完了跳出循环
                if(n == -1){
                    break;
                }
                // 只添加数组中真实读到的数据
                stringBuilder.append(chars, 0 , n);
            }
        }catch(IOException e){
            throw new RuntimeException();
        }
        // 判定是否含有关键字
        // indexOf方法返回第一次出现指定内容的下标
        if(stringBuilder.indexOf(keyword) >= 0){
            System.out.println("文件内容包含关键字" + file.getAbsolutePath());
        }
        return;
    }
}
